home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -screenplay- / shareware / wreckage / source / assembly / asm_3d_s.asm < prev    next >
Assembly Source File  |  1999-02-08  |  3KB  |  200 lines

  1. ;    a0     &ox
  2. ;    a1    &oy
  3. ;    a2    &oz
  4. ;    a3    &oapp
  5. ;    a4    &sincache
  6. ;    d0    templong
  7. ;    sincache(0)=cvaz*32767;0
  8. ;    sincache(1)=svaz*32767;2
  9. ;    sincache(2)=cvax*32767;4
  10. ;    sincache(3)=svax*32767;6
  11. ;    sincache(4)=cvay*32767;8
  12. ;    sincache(5)=svay*32767;10
  13.  
  14.         ;A5-A7 MUST NOT BE TRASHED!!!
  15.     MOVE.w    (a4),d0
  16.     MOVEM.l    a4-a6,-(a7)    ;PUSH a5
  17.     MOVE.l    d0,-(a7)
  18.     MOVE.l    d2,a4
  19.     MOVE.l    d1,a6    ;load new value
  20.  
  21. _rot_loop1:
  22.  
  23.     MOVE.b     (a3)+,d1    ;oapp
  24.       BEQ     _hide_point2    ;(oapp=0)=> skip point
  25.  
  26.  
  27. ;Main Code :)
  28. ;--------
  29.  
  30.     MOVE.w    (a4),d6    ;get cos
  31.     MOVE.w    2(a4),d7    ;get sin
  32.  
  33.       MOVE.l     (a0)+,d1    ;d1=ox(n)
  34.      CLR.w     d1
  35.       SWAP     d1
  36.  
  37.       MOVE.w     d1,d2    ;d2=x
  38.       MULS.w     d6,d1    ;x*csa
  39.  
  40.       MULS.w     d7,d2    ;x*sna
  41.  
  42.  
  43.       MOVE.l     (a1)+,d3    ;oy(n)
  44.       CLR.w     d3
  45.       SWAP     d3
  46.  
  47.       MOVE.w     d3,d4    ;y
  48.  
  49.       MULS.w     d7,d3    ;y*sna
  50.       SUB.l     d3,d1    ;x*csa-y*sna
  51.  
  52.       MULS.w     d6,d4    ;y*csa
  53.       ADD.l     d2,d4    ;y*csa+x*sna
  54.  
  55.  
  56.  
  57.     ;d4 holds Y
  58.     ;d1 holds X
  59.  
  60.  
  61. _rot_loop2:
  62. ;      yy=y*cvax-z*svax    
  63. ;      zz=z*cvax+y*svax
  64.  
  65.     MOVE.w    4(a4),d6    ;get cos
  66.     MOVE.w    6(a4),d7    ;get sin
  67.  
  68.       MOVE.l     (a2)+,d5    ;d2=oz(n)
  69.      CLR.w     d5
  70.       SWAP     d5
  71.  
  72.       MOVE.w     d5,d2    ;d2=z
  73.  
  74.       MULS.w     d6,d5    ;z*csa
  75.       MULS.w     d7,d2    ;z*sna
  76.  
  77.     CLR.w    d4
  78.     SWAP    d4
  79.       MOVE.w     d4,d3    ;y is still here
  80.                 ;   <grin>
  81.  
  82.       MULS.w     d6,d3    ;y*csa
  83.       SUB.l     d2,d3    ;yy=y*csa-z*sna
  84.  
  85.       MULS.w     d7,d4    ;y*sna
  86.       ADD.l     d5,d4    ;zz=z*csa+y*sna
  87.  
  88. ;    X    D1
  89. ;    Z    D4
  90. ;    Y    D3 (do not trash)
  91. ;        -----------------
  92.  
  93. _rot_loop3:
  94. ;      xx=x*cvay-z*svay
  95. ;      zz=z*cvay+x*svay
  96.  
  97.     MOVE.w    8(a4),d6    ;get cos
  98.     MOVE.w    10(a4),d7    ;get sin
  99.  
  100.     CLR.W    d4
  101.     SWAP    d4
  102.       MOVE.w     d4,d2    ;d2=z (yes, it is still here)
  103.  
  104.       MULS.w     d6,d4    ;z*csa
  105.       MULS.w     d7,d2    ;z*sna
  106.  
  107.     CLR.w    d1
  108.     SWAP    d1
  109.  
  110.       MOVE.w     d1,d5    ;x is still here (I hope)
  111.       MULS.w     d6,d1    ;x*csa
  112.       SUB.l     d2,d1    ;xx=x*csa-z*sna
  113.  
  114.       MULS.w     d7,d5    ;x*sna
  115.       ADD.l     d4,d5    ;zz=z*csa+x*sna
  116.  
  117. ;    X    D1
  118. ;    Y    D3
  119. ;    Z    D5
  120.  
  121.  
  122. ;    And do the 2d->3d Projection
  123.  
  124.     MOVE.w    d3,d4
  125.     CLR.w    d3    ;d3 IS a longword..
  126.     SWAP    d3    ;but I am shifting it twice..
  127.     EXT.l    d3    ;yeah
  128.     ASR.l    #1,d3
  129. ;    ADDI.l    #6,d3
  130.     TST.l     d3
  131.     BLE     _hide_point
  132.     
  133.     MOVE.w    12(a4),d2
  134. ;    MOVE.w    d1,d6
  135.     DIVS.l    d3,d1    ;this is x
  136. ;    MOVE.w   d5,d7
  137.     DIVS.l    d3,d5    
  138.  
  139. ;    SWAP     d1
  140. ;    SWAP    d5
  141. ;    CLR.w    d1
  142. ;    CLR.w    d5
  143.  
  144. ;    TST.w    d4
  145. ;    BEQ    _no_accuracy
  146. ;    DIVU.l    d4,d6
  147. ;    DIVU.l    d4,d7
  148. ;    ADD.w    d6,d1
  149. ;    ADD.w    d7,d5
  150. _no_accuracy:
  151.     ASR.l    d2,d1
  152.     ASR.l    d2,d5
  153. ;    CMP.w    #320,d1
  154. ;    BLT    _clipa
  155. ;    MOVE.w     #320,d1
  156. ;    BRA    _clipd
  157. _clipa:
  158. ;    CMP.w    #-320,d1
  159. ;    BGT    _clipb
  160. ;    MOVE.w    #-320,d1
  161. _clipb:
  162. ;    CMP.w    #320,d5
  163. ;    BLT    _clipc
  164. ;    MOVE.w    #320,d5
  165. ;    BRA    _clipd
  166. _clipc:
  167. ;    CMP.w    #-320,d5
  168. ;    BGT    _clipd
  169. ;    MOVE.w    #-320,d5
  170. _clipd:
  171.  
  172.     ADD.w    14(a4),d1
  173.     ADD.w    16(a4),d5
  174.  
  175.     MOVE.w    #1    ,d7    ;display point!!
  176.     BRA    _loop_ending
  177.     
  178.         
  179. _hide_point2:
  180.     ADDQ.l    #4    ,a0
  181.     ADDQ.l    #4    ,a1
  182.     ADDQ.l    #4    ,a2
  183.  
  184. _hide_point:
  185.     CLR.w d7
  186.  
  187.  
  188. _loop_ending:
  189.     
  190.     
  191.     MOVE.w     d1    ,(a6)+    ;sx
  192.      MOVE.w     d5    ,(a6)+        ;sy
  193.       MOVE.w     d7    ,(a6)+        ;app
  194.  
  195.       SUBQ.l    #1    ,d0    ;n=n-1
  196.       BGT     _rot_loop1
  197.  
  198.     MOVE.l    (a7)+    ,d0
  199.     MOVEM.l    (a7)+    ,a4-a6    ;POP A5
  200.